package com.gxa.hualian.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Component
//切面
//@Aspect
public class LoggerAspect {
    /**
     * 切点:找到目标方法
     * excution 定义如何找到目标service中的类中的方法
     * 第一个*:表示任意访问权限
     * 第二个*：表示任意类
     * 第三个*：表示任意方法
     * ..  ：表示任意参数
     */
    @Pointcut("execution(* com.gxa.hualian.service.Impl.*.*(..))")
    public void pointCut(){}
  /*  @Before("pointCut()")
    //通过JoinPoint增加连接点
    public void before(JoinPoint joinPoint){
        String name = joinPoint.getSignature().getName();
        System.out.println("用户执行了方法:"+name);
        System.out.println("参数:"+ Arrays.toString(joinPoint.getArgs()));
        System.out.println("前置通知");
    }
    @After("pointCut()")
    public void after(){
        System.out.println("后置通知");
    }
    @AfterReturning("pointCut()")
    public void afterReturning(){
        System.out.println("后置返回通知");
    }
    @AfterThrowing("pointCut()")
    public void afterThrowing(){
        System.out.println("后置抛出通知");
    }*/

    @Around("pointCut()")
    public void around(ProceedingJoinPoint proceedingJoinPoint){
        //把 前/后/后置返回/后置抛出  所有通知集成

        try {
            System.out.println("前置");
            proceedingJoinPoint.proceed();
            System.out.println("后置返回");
        } catch (Throwable throwable) {
           // throwable.printStackTrace();
            System.out.println("后置抛出");
        }finally {
            System.out.println("最终执行");
        }

    }
}
